package com.noriental.okcalls.wechat.callback;

import com.noriental.okcalls.wechat.callback.dispatch.WxWxMsgDefaultDispatcher;
import com.noriental.okcalls.wechat.callback.dispatch.WxMsgDispatcher;
import com.noriental.okcalls.wechat.msg.event.InEquDataMsg;
import com.noriental.okcalls.wechat.msg.event.InEqubindEvent;
import com.noriental.okcalls.wechat.msg.in.*;
import com.noriental.okcalls.wechat.msg.in.card.*;
import com.noriental.okcalls.wechat.msg.in.event.*;
import com.noriental.okcalls.wechat.msg.in.speech_recognition.InSpeechRecognitionResults;
import lombok.extern.slf4j.Slf4j;

import static com.noriental.okcalls.wechat.config.WxApiConfigInstance.*;

/***
 * *   ____  ___________  ___________           ________   ____  __.  _____ _____.___.
 * *   \   \/  /\______ \ \_   _____/           \_____  \ |    |/ _| /  _  \\__  |   |
 * *    \     /  |    |  \ |    __)     ______   /   |   \|      <  /  /_\  \/   |   |
 * *    /     \  |    `   \|     \     /_____/  /    |    \    |  \/    |    \____   |
 * *   /___/\  \/_______  /\___  /              \_______  /____|__ \____|__  / ______|
 * *    	 \_/        \/     \/                       \/        \/       \/\/
 * *
 * *   功能描述：
 * *
 * *   @DATE    2020-10-12
 * *   @AUTHOR  qiyubin
 ***/
@Slf4j
public class WxMsgDispatchCenter {

    WxMsgDispatcher wxMsgDispatcher = new WxWxMsgDefaultDispatcher();

    public void setWxMsgDispatcher(WxMsgDispatcher wxMsgDispatcher) {
        this.wxMsgDispatcher = wxMsgDispatcher;
    }

    public void dispatch(String xml) {
        // 开发模式输出微信服务发送过来的  xml 消息
        if (devMode) {
            System.out.println("接收消息:");
            System.out.println(xml);
        }

        // 解析消息并根据消息类型分发到相应的
        // 处理方法
        InMsg msg = MsgAdapter.analysisMsg(xml);

        if (msg instanceof InTextMsg) {
            wxMsgDispatcher.processInTextMsg((InTextMsg) msg);
        } else if (msg instanceof InImageMsg) {
            wxMsgDispatcher.processInImageMsg((InImageMsg) msg);
        } else if (msg instanceof InSpeechRecognitionResults) {
            //update by unas at 2016-1-29, 由于继承InVoiceMsg，需要在InVoiceMsg前判断类型
            wxMsgDispatcher.processInSpeechRecognitionResults((InSpeechRecognitionResults) msg);
        } else if (msg instanceof InVoiceMsg) {
            wxMsgDispatcher.processInVoiceMsg((InVoiceMsg) msg);
        } else if (msg instanceof InVideoMsg) {
            wxMsgDispatcher.processInVideoMsg((InVideoMsg) msg);
        } else if (msg instanceof InShortVideoMsg) {
            //支持小视频
            wxMsgDispatcher.processInShortVideoMsg((InShortVideoMsg) msg);
        } else if (msg instanceof InLocationMsg) {
            wxMsgDispatcher.processInLocationMsg((InLocationMsg) msg);
        } else if (msg instanceof InLinkMsg) {
            wxMsgDispatcher.processInLinkMsg((InLinkMsg) msg);
        } else if (msg instanceof InCustomEvent) {
            wxMsgDispatcher.processInCustomEvent((InCustomEvent) msg);
        } else if (msg instanceof InFollowEvent) {
            wxMsgDispatcher.processInFollowEvent((InFollowEvent) msg);
        } else if (msg instanceof InQrCodeEvent) {
            wxMsgDispatcher.processInQrCodeEvent((InQrCodeEvent) msg);
        } else if (msg instanceof InLocationEvent) {
            wxMsgDispatcher.processInLocationEvent((InLocationEvent) msg);
        } else if (msg instanceof InMassEvent) {
            wxMsgDispatcher.processInMassEvent((InMassEvent) msg);
        } else if (msg instanceof InMenuEvent) {
            wxMsgDispatcher.processInMenuEvent((InMenuEvent) msg);
        } else if (msg instanceof InTemplateMsgEvent) {
            wxMsgDispatcher.processInTemplateMsgEvent((InTemplateMsgEvent) msg);
        } else if (msg instanceof InShakearoundUserShakeEvent) {
            wxMsgDispatcher.processInShakearoundUserShakeEvent((InShakearoundUserShakeEvent) msg);
        } else if (msg instanceof InVerifySuccessEvent) {
            wxMsgDispatcher.processInVerifySuccessEvent((InVerifySuccessEvent) msg);
        } else if (msg instanceof InVerifyFailEvent) {
            wxMsgDispatcher.processInVerifyFailEvent((InVerifyFailEvent) msg);
        } else if (msg instanceof InPoiCheckNotifyEvent) {
            wxMsgDispatcher.processInPoiCheckNotifyEvent((InPoiCheckNotifyEvent) msg);
        } else if (msg instanceof InWifiEvent) {
            wxMsgDispatcher.processInWifiEvent((InWifiEvent) msg);
        } else if (msg instanceof InUserCardEvent) {
            wxMsgDispatcher.processInUserCardEvent((InUserCardEvent) msg);
        } else if (msg instanceof InUpdateMemberCardEvent) {
            wxMsgDispatcher.processInUpdateMemberCardEvent((InUpdateMemberCardEvent) msg);
        } else if (msg instanceof InUserPayFromCardEvent) {
            wxMsgDispatcher.processInUserPayFromCardEvent((InUserPayFromCardEvent) msg);
        } else if (msg instanceof InMerChantOrderEvent) {
            wxMsgDispatcher.processInMerChantOrderEvent((InMerChantOrderEvent) msg);
        } else if (msg instanceof InCardPassCheckEvent) {
            wxMsgDispatcher.processInCardPassCheckEvent((InCardPassCheckEvent) msg);
        } else if (msg instanceof InCardPayOrderEvent) {
            wxMsgDispatcher.processInCardPayOrderEvent((InCardPayOrderEvent) msg);
        } else if (msg instanceof InCardSkuRemindEvent) {
            wxMsgDispatcher.processInCardSkuRemindEvent((InCardSkuRemindEvent) msg);
        } else if (msg instanceof InUserConsumeCardEvent) {
            wxMsgDispatcher.processInUserConsumeCardEvent((InUserConsumeCardEvent) msg);
        } else if (msg instanceof InUserGetCardEvent) {
            wxMsgDispatcher.processInUserGetCardEvent((InUserGetCardEvent) msg);
        } else if (msg instanceof InUserGiftingCardEvent) {
            wxMsgDispatcher.processInUserGiftingCardEvent((InUserGiftingCardEvent) msg);
        }
        //===================微信智能硬件========================//
        else if (msg instanceof InEqubindEvent) {
            wxMsgDispatcher.processInEqubindEvent((InEqubindEvent) msg);
        } else if (msg instanceof InEquDataMsg) {
            wxMsgDispatcher.processInEquDataMsg((InEquDataMsg) msg);
            //===================微信智能硬件========================//
        } else if (msg instanceof InNotDefinedEvent) {
            log.error("未能识别的事件类型。 消息 xml 内容为：\n" + xml);
            processIsNotDefinedEvent((InNotDefinedEvent) msg);
        } else if (msg instanceof InNotDefinedMsg) {
            log.error("未能识别的消息类型。 消息 xml 内容为：\n" + xml);
            processIsNotDefinedMsg((InNotDefinedMsg) msg);
        }
    }

    private static void processIsNotDefinedEvent(InNotDefinedEvent msg) {

    }

    private static void processIsNotDefinedMsg(InNotDefinedMsg msg) {

    }


}
